from sqlmodel import Session, create_engine, select

from app.service import crud
from app.core.config import settings
from app.model.models import User, UserCreate

engine = create_engine(str(settings.SQLALCHEMY_DATABASE_URI))

def init_db(session: Session) -> None:

    """
    初始化数据库并确保超级用户存在。
    
    该函数用于在应用启动时初始化数据库，并检查是否存在指定的超级用户。
    如果超级用户不存在，则会创建一个新的超级用户。
    
    参数:
        session (Session): SQLModel 的数据库会话对象。
    
    注意事项:
        1. 数据库表的创建通常由 Alembic 迁移处理，不建议在此处直接创建表。
        2. 确保所有 SQLModel 模型已正确导入（通常在 `app.models` 中），否则关系可能无法正确初始化。
        3. 超级用户的邮箱和密码通过配置文件（`settings.FIRST_SUPERUSER` 和 `settings.FIRST_SUPERUSER_PASSWORD`）提供。
    
    参考:
        - SQLModel 文档: https://sqlmodel.tiangolo.com/
        - 相关问题: https://github.com/fastapi/full-stack-fastapi-template/issues/28
    """
    user = session.exec(
        select(User).where(User.email == settings.FIRST_SUPERUSER)
    ).first()
    if not user:
        user_in = UserCreate(
            email=settings.FIRST_SUPERUSER,
            password=settings.FIRST_SUPERUSER_PASSWORD,
            is_superuser=True,
        )
        user = crud.create_user(session=session, user_create=user_in)
